package com.tul.vapp.servicecenter.service;

import com.tul.vapp.servicecenter.entity.Item;
import com.tul.vapp.servicecenter.entity.ItemVo;
import com.tul.vapp.servicecenter.entity.Namespace;

import java.util.List;

/**
 * 配置项服务
 *
 * @author wwxiang
 * @since 2018/1/3.
 */
public interface IItemService {
    /**
     * 新增item
     *
     * @param appId     appId
     * @param namespace namespace
     * @param keyName   keyName
     * @param value     新值
     * @return 结果
     */
    boolean addItem(String appId, String namespace, String keyName, String value);

    /**
     * 获取指定空间下，所有配置项
     *
     * @param appId     应用ID
     * @param namespace 命名空间
     * @return 配置项
     */
    List<Item> getItems(String appId, String namespace);

    /**
     * 获取指定空间下，所有配置项Vo
     *
     * @param appId     appId字段
     * @param namespace 命名空间id
     * @return 配置项Vo
     */
    List<ItemVo> getItemVos(String appId, String namespace);

    /**
     * 获取已发布的配置项
     *
     * @param appId     appId
     * @param namespace namespace
     * @return 配置项
     */
    List<Item> getReleaseItems(String appId, String namespace);

    /**
     * 更新命名空间下指定keyName的值
     *
     * @param itemVo 前端传来的参数
     */
    void update(ItemVo itemVo);

    /**
     * 更新命名空间下指定keyName的值
     *
     * @param appId     appId
     * @param namespace namespace
     * @param keyName   keyName
     * @param newValue  新值
     */
    void update(String appId, String namespace, String keyName, String newValue);

    /**
     * 删除指定项
     *
     * @param appId     应用ID
     * @param namespace 命名空间
     * @param keyName   配置项
     */
    void delete(String appId, String namespace, String keyName);

    /**
     * 删除指定命名空间下的所有items
     *
     * @param appId     应用ID
     * @param namespace 命名空间
     */
    void deleteItems(String appId, String namespace);

    /**
     * 配置发布，配置是按照namespace批量发布的
     *
     * @param appId     应用ID
     * @param namespace 命名空间
     */
    void publish(String appId, String namespace);

    /**
     * 找出配置项发生变化的 Namespace
     *
     * @return 命名空间(appId, namespace)
     */
    List<Namespace> getModifiedNamespace();

    /**
     * 回退DB中所有的配置项
     *
     * @param appId     应用ID
     * @param namespace 命名空间
     */
    void rollback(String appId, String namespace);

    /**
     * 一致性检查，确保发布表和操作表一致
     *
     * @param appId     应用ID
     * @param namespace 命名空间
     */
    void sanityCheck(String appId, String namespace);
}
